"""
闭包：
    1.简单闭包 def函数嵌套
    2.nonlocal：使用nonlocal关键字修饰外部函数的变量才可以在内部函数修改它
    3.闭包实现ATM案例

闭包的优缺点：
    优点：
    1.无需定义全局变量即可实现通过函数持续的访问和修改某个值
    2.闭包所使用的变量的作用域在函数内，难以被错误的调用修改
    缺点：
    1.由于内部函数持续引用外部函数的值，所以会导致这部分内存空间不会被释放，一直占用内存
"""

# 简单闭包
"""
def outer(logo):
    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")

    return inner


fn1 = outer("python3.10")
fn1("认真学习基础")

fn2 = outer("python3.20")
fn2("认真学习基础")
fn2("实战练习")
"""

# nonlocal关键字修饰外部函数变量
"""
def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)

    return inner


fn = outer(10)
fn(10)
fn(10)
fn(10)
"""


# 使用闭包实现ATM案例
def atm_outer(initial_amount=0):
    def atm_inner(amount, deposit=True):
        nonlocal initial_amount
        if deposit:
            initial_amount += amount
            print(f"存款:+{amount}, 账户余额为:{initial_amount}")
        else:
            initial_amount -= amount
            print(f"取款:-{amount}, 账户余额为:{initial_amount}")

    return atm_inner


atm = atm_outer(100)
atm(300)
atm(300)
atm(100, False)
